From 32ba5ce7d894dfc703d87451985d25bdf5938177 Mon Sep 17 00:00:00 2001 From: Owen Taylor Date: Wed, 25 Feb 2004 17:28:34 +0000 Subject: [PATCH] Patch from Padraig O'Briain to add gtk_widget_add/remove_mnemonic_label, Wed Feb 25 12:21:32 2004 Owen Taylor * gtk/gtkwidget.[ch] gtk/gtklabel.c: Patch from Padraig O'Briain to add gtk_widget_add/remove_mnemonic_label, gtk_widget_get_mnemonic_labels(). (#103456) --- ChangeLog | 6 +++ ChangeLog.pre-2-10 | 6 +++ ChangeLog.pre-2-4 | 6 +++ ChangeLog.pre-2-6 | 6 +++ ChangeLog.pre-2-8 | 6 +++ gtk/gtklabel.c | 18 ++++++--- gtk/gtkwidget.c | 99 ++++++++++++++++++++++++++++++++++++++++++++++ gtk/gtkwidget.h | 7 +++- 8 files changed, 147 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index a381bd7c0a..98d9a051b1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Wed Feb 25 12:21:32 2004 Owen Taylor + + * gtk/gtkwidget.[ch] gtk/gtklabel.c: Patch from + Padraig O'Briain to add gtk_widget_add/remove_mnemonic_label, + gtk_widget_get_mnemonic_labels(). (#103456) + 2004-02-25 Danilo Å egan * configure.in: Added sr@ije to ALL_LINGUAS. diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index a381bd7c0a..98d9a051b1 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,9 @@ +Wed Feb 25 12:21:32 2004 Owen Taylor + + * gtk/gtkwidget.[ch] gtk/gtklabel.c: Patch from + Padraig O'Briain to add gtk_widget_add/remove_mnemonic_label, + gtk_widget_get_mnemonic_labels(). (#103456) + 2004-02-25 Danilo Å egan * configure.in: Added sr@ije to ALL_LINGUAS. diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index a381bd7c0a..98d9a051b1 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,9 @@ +Wed Feb 25 12:21:32 2004 Owen Taylor + + * gtk/gtkwidget.[ch] gtk/gtklabel.c: Patch from + Padraig O'Briain to add gtk_widget_add/remove_mnemonic_label, + gtk_widget_get_mnemonic_labels(). (#103456) + 2004-02-25 Danilo Å egan * configure.in: Added sr@ije to ALL_LINGUAS. diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index a381bd7c0a..98d9a051b1 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,9 @@ +Wed Feb 25 12:21:32 2004 Owen Taylor + + * gtk/gtkwidget.[ch] gtk/gtklabel.c: Patch from + Padraig O'Briain to add gtk_widget_add/remove_mnemonic_label, + gtk_widget_get_mnemonic_labels(). (#103456) + 2004-02-25 Danilo Å egan * configure.in: Added sr@ije to ALL_LINGUAS. diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index a381bd7c0a..98d9a051b1 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,9 @@ +Wed Feb 25 12:21:32 2004 Owen Taylor + + * gtk/gtkwidget.[ch] gtk/gtklabel.c: Patch from + Padraig O'Briain to add gtk_widget_add/remove_mnemonic_label, + gtk_widget_get_mnemonic_labels(). (#103456) + 2004-02-25 Danilo Å egan * configure.in: Added sr@ije to ALL_LINGUAS. diff --git a/gtk/gtklabel.c b/gtk/gtklabel.c index 24346724ca..67399bfc94 100644 --- a/gtk/gtklabel.c +++ b/gtk/gtklabel.c @@ -766,14 +766,20 @@ gtk_label_set_mnemonic_widget (GtkLabel *label, g_return_if_fail (GTK_IS_WIDGET (widget)); if (label->mnemonic_widget) - g_object_weak_unref (G_OBJECT (label->mnemonic_widget), - label_mnemonic_widget_weak_notify, - label); + { + gtk_widget_remove_mnemonic_label (label->mnemonic_widget, GTK_WIDGET (label)); + g_object_weak_unref (G_OBJECT (label->mnemonic_widget), + label_mnemonic_widget_weak_notify, + label); + } label->mnemonic_widget = widget; if (label->mnemonic_widget) - g_object_weak_ref (G_OBJECT (label->mnemonic_widget), - label_mnemonic_widget_weak_notify, - label); + { + g_object_weak_ref (G_OBJECT (label->mnemonic_widget), + label_mnemonic_widget_weak_notify, + label); + gtk_widget_add_mnemonic_label (label->mnemonic_widget, GTK_WIDGET (label)); + } g_object_notify (G_OBJECT (label), "mnemonic_widget"); } diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index 874a3d1360..2f2a9c300e 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -249,6 +249,7 @@ static GQuark quark_colormap = 0; static GQuark quark_pango_context = 0; static GQuark quark_rc_style = 0; static GQuark quark_accessible_object = 0; +static GQuark quark_mnemonic_labels = 0; GParamSpecPool *_gtk_widget_child_property_pool = NULL; GObjectNotifyContext *_gtk_widget_child_property_notify_context = NULL; @@ -322,6 +323,7 @@ gtk_widget_class_init (GtkWidgetClass *klass) quark_pango_context = g_quark_from_static_string ("gtk-pango-context"); quark_rc_style = g_quark_from_static_string ("gtk-rc-style"); quark_accessible_object = g_quark_from_static_string ("gtk-accessible-object"); + quark_mnemonic_labels = g_quark_from_static_string ("gtk-mnemonic-labels"); style_property_spec_pool = g_param_spec_pool_new (FALSE); _gtk_widget_child_property_pool = g_param_spec_pool_new (TRUE); @@ -6362,6 +6364,9 @@ gtk_widget_real_destroy (GtkObject *object) g_object_set_qdata (G_OBJECT (widget), quark_accel_path, NULL); g_object_set_qdata (G_OBJECT (widget), quark_accel_closures, NULL); + /* Callers of add_mnemonic_label() should disconnect on ::destroy */ + g_object_set_qdata (G_OBJECT (widget), quark_mnemonic_labels, NULL); + gtk_grab_remove (widget); g_object_unref (widget->style); @@ -7310,6 +7315,100 @@ gtk_widget_get_clipboard (GtkWidget *widget, GdkAtom selection) selection); } +/** + * gtk_widget_list_mnemonic_labels: + * @widget: a #GtkWidget + * + * Returns a newly allocated list of the widgets, normally labels, for + * which this widget is a the target of a mnemonic (see for example, + * gtk_label_set_mnemonic_widget()). + + * The widgets in the list are not individually referenced. If you + * want to iterate through the list and perform actions involving + * callbacks that might destroy the widgets, you + * must call g_list_foreach (result, + * (GFunc)g_object_ref, NULL) first, and then unref all the + * widgets afterwards. + + * Return value: the list of mnemonic labels; free this list + * with g_list_free() when you are done with it. + * + * Since: 2.4 + **/ +GList * +gtk_widget_list_mnemonic_labels (GtkWidget *widget) +{ + GList *list = NULL; + GSList *l; + + g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL); + + for (l = g_object_get_qdata (G_OBJECT (widget), quark_mnemonic_labels); l; l = l->next) + list = g_list_prepend (list, l->data); + + return list; +} + +/** + * gtk_widget_remove_mnemonic_label: + * @widget: a #GtkWidget + * @label: a #GtkWidget that acts as a mnemonic label for @widget. + * + * Adds a widget to the list of mnemonic labels for + * this widget. (See gtk_widget_get_mnemonic_labels()). Note the + * list of mnemonic labels for the widget is cleared when the + * widget is destroyed, so the caller must make sure to update + * it's internal state at this point as well, by using a connection + * to the ::destroy signal or a weak notifier. + * + * Since: 2.4 + **/ +void +gtk_widget_add_mnemonic_label (GtkWidget *widget, + GtkWidget *label) +{ + GSList *old_list, *new_list; + + g_return_if_fail (GTK_IS_WIDGET (widget)); + g_return_if_fail (GTK_IS_WIDGET (label)); + + old_list = g_object_steal_qdata (G_OBJECT (widget), quark_mnemonic_labels); + new_list = g_slist_prepend (old_list, label); + + g_object_set_qdata_full (G_OBJECT (widget), quark_mnemonic_labels, + new_list, (GDestroyNotify) g_slist_free); +} + +/** + * gtk_widget_remove_mnemonic_label: + * @widget: a #GtkWidget + * @label: a #GtkWidget that was previously set as a mnemnic label for + * @widget with gtk_widget_add_mnemonic_label(). + * + * Removes a widget from the list of mnemonic labels for + * this widget. (See gtk_widget_get_mnemonic_labels()). The widget + * must have previously been added to the list with + * gtk_widget_add_mnemonic_label(). + * + * Since: 2.4 + **/ +void +gtk_widget_remove_mnemonic_label (GtkWidget *widget, + GtkWidget *label) +{ + GSList *old_list, *new_list; + + g_return_if_fail (GTK_IS_WIDGET (widget)); + g_return_if_fail (GTK_IS_WIDGET (label)); + + old_list = g_object_steal_qdata (G_OBJECT (widget), quark_mnemonic_labels); + new_list = g_slist_remove (old_list, label); + + if (new_list) + g_object_set_qdata_full (G_OBJECT (widget), quark_mnemonic_labels, + new_list, (GDestroyNotify) g_slist_free); +} + /** * gtk_widget_get_no_show_all: * @widget: a #GtkWidget diff --git a/gtk/gtkwidget.h b/gtk/gtkwidget.h index f1d8b8023c..ac7eed5e2e 100644 --- a/gtk/gtkwidget.h +++ b/gtk/gtkwidget.h @@ -760,6 +760,12 @@ void gtk_widget_class_path (GtkWidget *widget, gchar **path, gchar **path_reversed); +GList* gtk_widget_get_mnemonic_labels (GtkWidget *widget); +void gtk_widget_add_mnemonic_label (GtkWidget *widget, + GtkWidget *label); +void gtk_widget_remove_mnemonic_label (GtkWidget *widget, + GtkWidget *label); + GType gtk_requisition_get_type (void); GtkRequisition *gtk_requisition_copy (const GtkRequisition *requisition); void gtk_requisition_free (GtkRequisition *requisition); @@ -778,7 +784,6 @@ void _gtk_widget_propagate_screen_changed (GtkWidget *widget, GdkColormap* _gtk_widget_peek_colormap (void); - #ifdef __cplusplus } #endif /* __cplusplus */ -- 2.30.2